package cn.stu.framework.service.impl;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.text.CharSequenceUtil;
import cn.stu.common.utils.ApiData;
import cn.stu.common.utils.R;
import cn.stu.framework.dto.RoleDto;
import cn.stu.framework.entity.Role;
import cn.stu.framework.entity.Users;
import cn.stu.framework.mapper.RoleMapper;
import cn.stu.framework.mapper.UsersMapper;
import cn.stu.framework.service.RoleService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.List;


/**
 * 角色服务实施
 *
 * @author 郑志豪
 * @date 2023/09/18
 */
@Service
@AllArgsConstructor
public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements RoleService {

    private UsersMapper usersMapper;

    /**
     * 角色列表
     *
     * @param dto DTO
     * @return {@link ApiData}
     */
    @Override
    public ApiData roleList(RoleDto dto) {
        if (Boolean.TRUE.equals(dto.getAll())) {
            return ApiData.getTrue("获取成功", list());
        }
        Page<Role> page = new Page<>(dto.getPage(), dto.getLimit());
        lambdaQuery().like(CharSequenceUtil.isNotBlank(dto.getRoleName()), Role::getRoleName, dto.getRoleName()).page(page);
        return ApiData.getPageTrue("获取成功", page.getTotal(), page.getRecords());
    }

    /**
     * 角色添加
     *
     * @param add 添加
     * @return {@link ApiData}
     */
    @Override
    public ApiData roleAdd(Role add) {
        if (CharSequenceUtil.isBlank(add.getRoleName())) {
            return ApiData.getFalse("角色名不能为空！");
        }
        boolean exists = lambdaQuery().eq(Role::getRoleName, add.getRoleName()).exists();
        if (exists) {
            return ApiData.getFalse("角色名已存在！");
        }
        baseMapper.insert(add);
        return ApiData.getTrue("添加成功！");
    }

    /**
     * 角色更新
     *
     * @param update 更新
     * @return {@link ApiData}
     */
    @Override
    public ApiData roleUpdate(Role update) {
        if (update.getRoleId() == null) {
            return ApiData.getFalse("角色ID为空");
        }
        Role role = lambdaQuery().eq(Role::getRoleId, update.getRoleId()).one();
        if (role == null) {
            return ApiData.getFalse("角色不存在！");
        }
        if (CharSequenceUtil.isBlank(update.getRoleName())) {
            return ApiData.getFalse("角色名不能为空！");
        }
        boolean exists = lambdaQuery().eq(Role::getRoleName, update.getRoleName()).exists();
        if (!role.getRoleName().equals(update.getRoleName()) && exists) {
            return ApiData.getFalse("角色名已存在！");
        }
        baseMapper.updateById(update);
        return ApiData.getTrue("修改成功！");
    }

    /**
     * 角色
     *
     * @param roleId 角色ID
     * @return {@link ApiData}
     */
    @Override
    public ApiData roleDel(Long roleId) {
        boolean roleExists = lambdaQuery().eq(Role::getRoleId, roleId).exists();
        if (!roleExists) {
            return ApiData.getFalse("角色不存在！");
        }
        if (roleId == 1) {
            return ApiData.getFalse("该角色不可删除！");
        }
        LambdaQueryWrapper<Users> usersQuery = new LambdaQueryWrapper<>();
        usersQuery.eq(Users::getRoleId, roleId);
        List<Users> users = usersMapper.selectList(usersQuery);
        if (CollUtil.isNotEmpty(users)) {
            return ApiData.getFalse("此角色使用中！");
        }
        baseMapper.deleteById(roleId);
        return ApiData.getTrue("删除成功！");
    }

    /**
     * 角色信息
     *
     * @param roleId 角色ID
     * @return {@link ApiData}
     */
    @Override
    public ApiData roleInfo(Long roleId) {
        if (roleId == null) {
            return ApiData.getTrue("获取成功", list());
        }
        Role r = baseMapper.selectById(roleId);
        return ApiData.getTrue("获取成功", r);
    }

    /**
     * 选择角色列表
     *
     * @param role 角色
     * @return {@link R}<{@link List}<{@link Role}>>
     */
    @Override
    public R<List<Role>> selectRoleList(Role role) {
        return R.ok(this.list());
    }
}
